import os
import xlrd
import xlwt
import time
import requests
import re
import logging


def get_xls():
    '''
    获取源文件目录中的文件，并过滤出表格，形成一个表格列表
    :return: 返回一个 source_file 目录下所有表格文件的文件名的列表
    '''
    # 获取文件列表
    print("读取文件列表...")
    xlxs_files = os.listdir("./source_file")
    # print("源文件目录中的文件列表：", xlxs_files)

    # 过滤掉不是表格的文件，返回一个都是表格名称的列表
    excels = []
    for xlxs_file in xlxs_files:
        if (xlxs_file.endswith(".xlsx") or xlxs_file.endswith(".xls")) \
                and (not xlxs_file.startswith("~$")) \
                or xlxs_file.endswith(".xlsm"):
            excels.append(xlxs_file)

    return excels


def export_new_excle(excels):
    '''
    处理文件，将内容导出到一张新表中，生成的新文件在 destination_file 目录下
    :param excels: 参数类型要为列表类型或者元组类型
    :return:None
    '''
    print("进行文件内容导出成新表操作...")
    # 表头，第一行的数据
    sheet_head_content = ['姓', '中间名', '名', '入职日期', '公司', '事件原因', '英文姓', '英文名', '电话号码',
                          '电子邮箱地址', '银行账号', '银行账号归属地信息', '经理', '竞业限制协议', '证件类型', '身份证号', '出生日期',
                          '性别', '婚姻状况', '国籍', '最高学历']
    # 获取信息的键
    sheet_head_content_key = ['姓氏', '中间名', '名', '* 入职日期 (DD/MM/YYYY)', '* 公司', '* 事件原因', '英文姓', '英文名', '* 电话号码',
                              '* 电子邮箱地址', '银行帐号', '银行账号归属地信息', '* 经理', '竞业限制协议', '* 证件类型', '* 身份证号',
                              '* 出生日期 (DD/MM/YYYY)',
                              '* 性别', '婚姻状况', '* 国家', '最高学历']

    #########################
    # 1 判断校验参数
    #########################
    if excels is None or not (isinstance(excels, list) or isinstance(excels, tuple)):
        raise Exception("参数 excels 不是列表类型（或 元组类型）")

    if len(excels) == 0:
        raise FileNotFoundError("请将要操作的表格复制到 source_file 后，再重新执行程序")

    ########################
    # 2 初始化导出文件
    ########################
    # 创建工作簿
    export_workbook = xlwt.Workbook()
    # 创建sheet
    export_sheet = export_workbook.add_sheet("导出表", cell_overwrite_ok=True)
    # 写入表头数据到sheet中
    write_one_row(export_sheet, 0, sheet_head_content)

    ########################
    # 填充表格内容
    ########################
    # 读取每张表格的内容，并且形成新表的每一行记录
    for row_num, excel in enumerate(excels):
        excel_path = "./source_file/" + excel
        # 打开文件,读取每一个文件中内容
        workbook = xlrd.open_workbook(excel_path)

        # 打开文件，查看是否存在要操作的sheet表格
        sheet_names = workbook.sheet_names()
        # print("sheet_names:",sheet_names)
        filter_sheet_names = list(filter(lambda sheet_name: sheet_name.upper() == "NEW HIRE FORM", sheet_names))
        # print("需要处理的sheet:", filter_sheet_names)
        if len(filter_sheet_names) == 0:
            raise FileNotFoundError(("%s未发现要处理的表格，请确认" % excel))

        # 对查找到的表格进行分析，并形成新表
        for filter_sheet_name in filter_sheet_names:
            sheet = workbook.sheet_by_name(filter_sheet_name)
            excel_content_dict = {}
            for line_num in range(sheet.nrows):
                line_content_list = sheet.row_values(line_num)
                # 表格中的每行内容
                # print("行内容：", line_content_list)
                if line_content_list[2] in sheet_head_content_key:
                    # 特殊情况下的，一些特殊的操作
                    if line_content_list[2] in ['姓氏', '中间名', '名']:
                        # 去除这几行中的英文提示信息
                        excel_content_dict[line_content_list[2]] = line_content_list[4]
                    elif line_content_list[2] == "* 出生日期 (DD/MM/YYYY)":
                        brith_date = sheet.cell_value(50, 4)
                        excel_content_dict[line_content_list[2]] = brith_date
                    elif line_content_list[2] == "* 身份证号":
                        ID = sheet.cell_value(66, 4)
                        excel_content_dict[line_content_list[2]] = ID
                    elif line_content_list[2] == "* 性别":
                        gender = sheet.cell_value(78, 4)
                        excel_content_dict[line_content_list[2]] = gender
                    elif line_content_list[2] in ["婚姻状况"]:
                        marrige_status = sheet.cell_value(80, 4)
                        excel_content_dict[line_content_list[2]] = marrige_status
                    elif line_content_list[2] in ["* 国家"]:
                        country = sheet.cell_value(62, 4)
                        excel_content_dict[line_content_list[2]] = country
                    elif line_content_list[2] in ['* 电话号码']:
                        # 处理两个手机号的情况
                        phone1 = sheet.cell_value(264, 4)
                        phone2 = sheet.cell_value(264, 8)
                        # 辨别是否有第二个号码
                        if phone2:
                            phone = str(phone1) + "/" + str(phone2)
                        else:
                            phone = str(phone1)
                        excel_content_dict[line_content_list[2]] = [phone]
                    elif line_content_list[2] in ['* 电子邮箱地址']:
                        # 处理两个电子邮箱的情况
                        email1 = sheet.cell_value(266, 4)
                        email2 = sheet.cell_value(266, 8)
                        # 辨别是否有第二个号码
                        if email2:
                            email = str(email1) + "/" + str(email2)
                        else:
                            email = str(email1)
                        excel_content_dict[line_content_list[2]] = [phone]

                    else:
                        excel_content_dict[line_content_list[2]] = line_content_list[4:]

            # 获取银行卡归属地信息
            card_id = excel_content_dict.get("银行帐号")
            # print("银行卡号:", card_id)
            bankcard_location = get_bankcard_location(card_id[0])
            excel_content_dict['银行账号归属地信息'] = bankcard_location

            # print("字典内容：", excel_content_dict)
            # 写入内容到sheet中
            for col in sheet_head_content_key:
                col_contents = excel_content_dict.get(col)
                if col_contents:
                    new_col_contents = []
                    for col_content in col_contents:
                        if col_content != "":
                            new_col_contents.append(str(col_content))
                    # 处理后的列内容
                    # print("列内容：", new_col_contents)
                    col_num = sheet_head_content_key.index(col)
                    export_sheet.write((row_num + 1), col_num, (r"".join(new_col_contents)).strip())
                    # print (excel_content_dict)
    # 保存新表
    export_workbook.save("./destination_file/export_excel.xlsx")


def write_one_row(sheet, row_num, row_content):
    '''
    写入内容到指定的一行中
    :param sheet_name: 要写入数据的 sheet 文件
    :param row_num: 行号
    :param row_content: 写入的内容
    :return:
    '''
    # 将表格内容写入到sheet的第一行，相关列
    for i, content in enumerate(row_content):
        sheet.write(0, i, content)


def get_bankcard_location(bankcard):
    """
    使用小爬虫来实现银行卡归属地的查询
    :param bankcard: 银行卡
    :return:
    """
    print("开启爬虫")
    if not bankcard:
        return "空"
    else:
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
        }
        kw = {"word": bankcard, "submit": ""}
        url = "http://www.cardcn.com/search.php?"
        response = requests.get(url, params=kw, headers=headers)
        time.sleep(0.05)  # 等待下
        # print("**" * 50 + "\n", "返回内容:", response.text)

        res = re.findall(r'<dt><font class="con_sub_title">.*?</font>(.*?)</dt>', response.text)
        # print("过滤到的结果", res[:4])

    if res:
        return " -- ".join(res[:4])
    else:
        return "无此卡片信息"

    print("爬虫运行结束")

    return res[:4]


def init_logger():
    '''
    初始化出一个日志对象，方便排查问题
    :return:
    '''
    logger = logging.getLogger()
    # 创建一个handler，用于写日志文件
    fh = logging.FileHandler("processing_form_log.log", encoding="utf-8")
    # 创建格式化对象
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    # fh应用格式
    fh.setFormatter(formatter)
    # logger 应用fh
    logger.addHandler(fh)

    return logger


if __name__ == '__main__':
    # 初始化一个日志对象，来记录日志
    logger = init_logger()

    if not (os.path.exists("destination_file") and \
                    os.path.exists("source_file")):
        os.mkdir("destination_file")
        os.mkdir("source_file")
    try:
        excels = get_xls()
        export_new_excle(excels)
    except FileNotFoundError as e:
        print(e)
        logger.error(e)
    except PermissionError:
        print("权限异常：表格正在被操作，无法进行处理，请关闭表格，重新运行本程序")
        logger.error("权限异常：表格正在被操作，无法进行处理，请关闭表格，重新运行本程序")
    except ConnectionError as e:
        print("爬虫部分出错，请检查 http://www.cardcn.com/search.php 是否可连")
        logger.error("爬虫部分出错，请检查 http://www.cardcn.com/search.php 是否可连")
    except Exception as e:
        print(e)
        logger.error(e)
    finally:
        time.sleep(5)

    print("程序执行结束...")
